package com.lzh.others;
import java.util.concurrent.Semaphore;

/**
 * 信号量
 * 使用步骤：
 * 1.初始化，指定许可集大小，许可集大小表示允许同时访问共享资源的线程数量
 * 2.acquire()获取许可，如果同时访问的数量大于许可集设定最大值，那么线程阻塞等待直到有可用许可
 * 3.访问共享资源，执行逻辑
 * 4.release()释放许可
 * 信号量适用于以下场景：
 *
 * 限制对共享资源的并发访问数量：例如，一个数据库连接池中，我们希望同时只有一个线程能够访问数据库，以避免过多的并发请求导致数据库压力过大。
 * 这时，我们可以使用信号量来限制同时访问数据库的线程数量。
 * 实现资源分配策略：例如，我们有多个打印机，我们希望每个时刻只有一个线程能够打印文档。这时，我们可以使用信号量来实现这种资源分配策略。
 */
public class SemaphoreExample {

        private static final int MAX_CONCURRENT_THREADS = 3; // 最大并发线程数
        private static Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS); // 创建信号量对象

        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                new Thread(new Task()).start(); // 创建并启动10个线程
            }
        }

        static class Task implements Runnable {
            @Override
            public void run() {
                try {
                    semaphore.acquire(); // 获取许可
                    System.out.println("线程 " + Thread.currentThread().getName() + " 开始执行任务");
                    // 模拟耗时操作
                    Thread.sleep(1000);
                    System.out.println("线程 " + Thread.currentThread().getName() + " 完成任务");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release(); // 释放许可
                }
            }
    }



}
